package com.sky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
 *
 */
@Component
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 配置认证管理器
     *
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

        /**
         * 账号密码登录认证模式
         */
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password(bCryptPasswordEncoder.encode("admin"))
                .authorities("/");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 配置认证方式 为httpBasic模式
        http.authorizeRequests()
                .antMatchers("/**")
                .fullyAuthenticated()
                .and()
                .httpBasic();
    }

    /**
     * 密码不加密编码处理
     */
//    @Bean
//    public static NoOpPasswordEncoder passwordEncoder() {
//        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
//    }

    /**
     * 密码加密编码处理
     * 使用BCryptPasswordEncoder加密密码
     *
     * @return PasswordEncoder
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

/*
这段代码是Spring Security的配置部分，主要用于配置应用程序的安全性。它分为两个主要的方法，一个是配置认证管理器，另一个是配置HTTP安全。

1、认证管理器配置方法 configure(AuthenticationManagerBuilder auth)：

@Override 注解表示该方法重写了父类 WebSecurityConfigurerAdapter 的方法。
protected void configure(AuthenticationManagerBuilder auth) throws Exception 方法用于配置认证管理器。
auth.inMemoryAuthentication() 使用内存中的认证方式来管理用户信息。这种方式适用于小型应用或开发测试阶段，因为用户信息存储在内存中，重启应用后信息会丢失。
.withUser("admin") 定义了一个用户名为“admin”的用户。
.password("admin") 设置该用户的密码为“admin”。注意这里使用的是明文密码。
.authorities("/") 为用户分配权限，这里的权限是根路径下的访问权限。实际上，权限的定义应该更明确和符合安全规范，而不是简单地使用路径作为权限。

2、HTTP安全配置方法 configure(HttpSecurity http)：

同样使用@Override注解重写了父类的方法。
protected void configure(HttpSecurity http) throws Exception 方法用于配置HTTP安全设置。
http.authorizeRequests() 开始配置对HTTP请求的访问控制。
.antMatchers("/**") 指定了所有的URL路径都需要认证和授权。
.fullyAuthenticated() 表示访问这些路径需要完全认证过的用户。
.and() 用于连接不同的配置段。
.httpBasic() 配置了HTTP基本认证方式，这是一种简单的认证方式，通常是通过浏览器弹出一个对话框让用户输入用户名和密码。
这段代码的主要功能是设置了一个基于内存的认证方式，其中包含一个用户名和密码均为“admin”的用户，并且为所有的HTTP请求配置了基本的HTTP认证，所有请求都需要用户认证后才能访问。这种配置方式适用于简单的安全需求或者开发测试阶段，但在生产环境中不推荐使用内存认证和明文密码，因为内存认证的安全性较低，而明文密码容易被泄露，存在安全隐患。

 */
